package org.chen.common.manager;


import org.chen.common.utils.spring.SpringUtils;

import java.util.TimerTask;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 线程池：用于异步完成一些任务，比如记录记录日志等<br>
 * 核心思想是统一通过线程池异步执行可能耗时的任务，避免阻塞主业务流程
 */
public class AsyncManager {
    /**
     * 操作延迟10毫秒
     * <p>
     * 每个任务调度实际执行前的延迟时间（毫秒）。
     * 目的是让提交任务线程尽快返回，任务异步稍后运行。
     * </p>
     */
    private final int OPERATE_DELAY_TIME = 10;

    /**
     * 异步操作任务调度线程池
     * <p>
     * 通过Spring IoC容器获取已配置好的ScheduledExecutorService实例。
     * 通常该线程池在Spring配置类中初始化并命名为scheduledExecutorService。
     * 用于调度异步定时任务执行。
     * </p>
     */
    private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
    /**
     * 单例对象
     * <p>
     * 类初始化时即创建AsyncManager唯一实例。
     * </p>
     */
    private static AsyncManager me = new AsyncManager();
    /**
     * 获取单例
     * <p>
     * 提供外部访问AsyncManager唯一实例的方法。
     * </p>
     *
     * @return AsyncManager实例
     */
    public static AsyncManager me()
    {
        return me;
    }

    /**
     * 执行异步任务
     * <p>
     * 向线程池提交一个TimerTask任务，并设置延迟10毫秒后异步执行。
     * 如记录登录日志、操作日志等业务耗时操作均可调用本方法。
     * </p>
     *
     * @param task 需要执行的异步任务
     */
    public void execute(TimerTask task)
    {
        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
    }

}
